Fastlane 是一套用ruby編寫的自動化工具集,為 iOS 和 Android 開發設計,旨在自動化處理許多繁瑣且重複的任務,如生成屏幕截圖、處理授權文件 (provisioning profiles) 以及打包、發布應用程序。
我們開發跨平台APP時候,每次的打包都有點麻煩(尤其iOS),需要在各自平台打包、上傳,還需要管理憑證,這一連串的手動操作不僅耗時,不小心還可能出錯。
我們身為軟體工程師,面對這種重複且機械化的工作,就是想要把它自動化!除了省事以外,自動化還更能確保每次的打包和發布都依循固定的流程和標準,減少人為操作的失誤,並提升工作效率。
環境需求
基本上,如果你在建立React Native時已經配置好iOS和Android的環境,那麼上述的需求你大部分都已經有了,不太需要再處理。
安裝Fastlane
我們用Homebrew 來安裝 Fastlane:
brew install fastlane
初始化
進入專案中的 ios 資料夾(這裡用ios當範例),執行初始化指令
fastlane init
在初始化過程中,會有幾個設置選項,你可以根據自己的需求選擇。
若選擇與 App Store 相關的選項,例如TestFlight或App Store,系統會提示你輸入Apple開發者帳號和密碼。只需按照提示進行即可。
上述初始化完成後,會在ios資料夾中生成一個fastlane資料夾,裡面會有一些配置文件:
在撰寫 Fastlane 腳本之前,我們先了解Fastlane的幾個基本概念。
Lane
Lane 在 Fastlane 中代表一個自動化的流程或工作流。由一系列指令或行動(action)組成的,描述了自動化任務的每一步。
lane :beta do
# 使用 action 打包app
build_app
end
輸入 fastlane beta 命令,就會依照 :beta lane 裡的指令順序執行。
Action
Action 是 Fastlane 自動化的基礎。每一個 action 都是一個具體的任務或操作,例如:打包、發佈到測試平台、上傳到 App Store 等。Fastlane 提供了許多內建的 actions,當然你也可以根據需求自定義 action。
在前面的例子中,build_app 就是一個內建的 action。
所有內建action列表
Action的參數
大部分的 actions 都提供參數選項,讓你更細的控制行為。有些參數是必需的,而有些則是可選的。
build_app(scheme: "MyApp", workspace: "MyApp.xcworkspace")
例如在這裡,我們使用 build_app action 並提供了 scheme 和 workspace 兩個參數。
若要查看某個 action 有哪些支持的參數,可以使用以下命令:
fastlane action [actionName]
Fastlane 腳本範例:打包 iOS 並輸出 .ipa 檔
# 設定預設的平台為 iOS
default_platform(:ios)
platform :ios do
# 定義一個新的lane,名為beta。
lane :beta do
# 使用build_app action打包APP。
# scheme: 你的scheme名稱。
# workspace: Xcode工作區的路徑。
build_app(
scheme: "rnDemo",
workspace: "rnDemo.xcworkspace",
include_bitcode: true,
# provisioningProfiles是一個物件,鍵是App的Bundle Identifier,值是Profile的名稱。
export_options: {
provisioningProfiles: {
"com.rnhello" => "com.rnhello"
}
}
)
end
end
執行以下指令,開始打包流程:
fastlane beta
如果default_platform
沒有設定 iOS 為預設平台,則需要在指令中明確指出,像這樣:
fastlane ios beta
打包完成後就會在目錄下看到.ipa檔
增加描述和一些細項的指定,並在打包完後,上傳到TestFlight
default_platform(:ios)
platform :ios do
desc "Build and upload to TestFlight"
lane :smartowon do
build_app(
# 在開始建置前,先清理舊的編譯檔案
clean: true,
# 指定 IPA 的輸出目錄
output_directory: './fastlane/release',
# 指定 IPA 輸出的檔案名稱
output_name: 'helloRN.ipa',
# 指定 Xcode 中的 scheme 名稱
scheme: "rnDemo",
# 指定建置設定,通常是 'Debug' 或 'Release'
configuration: 'Release',
# 是否包含 bitcode
include_bitcode: false,
# 指定 IPA 的輸出方式,例如 'app-store', 'ad-hoc', 'enterprise', 'development' 等
export_method: 'app-store',
# 附加到 xcodebuild 命令的參數
export_xcargs: '-allowProvisioningUpdates'
# '-allowProvisioningUpdates' 允許 xcodebuild 自動處理配置文件。
)
# 打包完成時,在 macOS 的通知中心顯示通知
notification(
title: 'Manager',
subtitle: 'Build successful. Preparing for upload...',
message: 'Uploading IPA...'
)
# 配置用於與 App Store Connect 通信的 API 金鑰
api_key = app_store_connect_api_key(
# 從 Apple Developer 網站獲得的 Key ID
key_id: '',
# 從 Apple Developer 網站獲得的 Issuer ID
issuer_id: '',
# API 金鑰的路徑,通常是一個 .p8 文件
key_filepath: '',
# 金鑰的有效期限,以秒為單位
duration: 1200
)
# 將已經打包的 IPA 文件上傳到 TestFlight
upload_to_testflight(
# 使用上面配置的 API 金鑰
api_key: api_key,
# 在 App Store Connect 上跳過等待建置處理的步驟
skip_waiting_for_build_processing: true,
# 指定要上傳的 IPA 文件的路徑
ipa: './fastlane/release/helloRN.ipa',
# 跳過最後的審核提交步驟,只做上傳動作
skip_submission: true
)
notification(
title: 'Manager',
subtitle: 'Upload to TestFlight successful',
message: 'Automation complete!'
)
end
end
有些人可能不知道XCode中scheme怎麼看,其實就是上方的這個
初始化
android目錄下執行
fastlane init
前置作業
在使用下面的Google Store上傳自動化流程之前,請先完成配置 Google 帳戶和金鑰。
詳情可以參考:fastlane android setup
Fastlane 腳本範例:打包和上傳至 Google Play Store
platform :android do
desc "自動化建構和上傳Android APK"
lane :build_and_upload do
# 使用gradle來建構Release版本的APK
gradle(
task: 'assemble',
build_type: 'Release'
)
# 上傳到Google Play Store(
upload_to_play_store(
track: 'alpha', # 您可以選擇不同的track,如alpha、beta或production
json_key: './path/to/your/google-api-key.json', # Google Play的API憑證路徑
package_name: 'com.your.app.package.name'
)
end
end
執行腳本
fastlane android build_and_upload
因為React Native跨平台的特性,我們的fastlane會在ios 和 android 各自的資料夾下,如果要打包兩個平台時,分別輸入各自的命令還是有點麻煩。想要更簡化的話,我們可以直接在package.json的scripts設置指令
例如:
"scripts": {
"build-ios": "cd ios && fastlane build_ios",
"build-android": "cd android && fastlane build_android",
"build-all": "npm run build-ios && npm run build-android"
}
接下來,只需輸入下面的命令,就可以自動化iOS和Android的打包:
npm run build-all
Fastlane能玩的東西還有很多,除了內建功能,還有眾多插件可以使用。大家可以依照自己的需求設計出屬於你或你的團隊的自動化部署流程。如有興趣,可以進一步參閱fastlane文檔和探索它的可用插件。
https://www.jianshu.com/p/4f63e8c26af8
https://docs.fastlane.tools/